package effectiveJava.myEnum;

/**
 * Created by dycong on 2017/9/4.
 * todo 1. java枚举本质是 int 值
 * todo 2. 枚举类型就是通过公有的静态的final域为每个枚举常量导出实例的类
 * todo 3. 枚举类型还允许添加任意的方法和域
 * todo 4. 并允许实现任意的接口
 * todo 5. 枚举提供了所有Object方法的高级实现，实现了Comparable,Serializable接口
 * todo 6. 枚举天生是不可变的因此所有的域都应该是final的
 * todo 7. 域可以使公有的，也可以使是私有的，但是提供公有的访问方法
 * todo 8. 提倡枚举项全部大写，单词之间用下划线分割，这也是从常量的角度考虑的
 */
public enum Planet {
    MERCURY(3.302e+23, 2.439e6),
    VENUS(4.869e+24, 6.052e6),
    EARTH(5.975e+24, 6.378e6),
    MARS(6.419e+23, 3.393e6),
    JUPITER(1.899e+27, 7.149e7),
    SATURN(5.685e+26, 6.027e7),
    URANUS(8.683e+25, 2.556e7),
    NEPTUNE(1.024e+26, 2.477e7);
    private final double mass; // In kilograms
    private final double radius; // In meters
    private final double surfaceGravity;

    private static final double G = 6.67300E-11;

    // Constructor
    private Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
        surfaceGravity = G * mass / (radius * radius);
    }

    public double getMass() {
        return mass;
    }

    public double getRadius() {
        return radius;
    }

    public double getSurfaceGravity() {
        return surfaceGravity;
    }

    public double surfaceWeight(double mass) {
        return mass * surfaceGravity; // F = ma
    }

    //域可以使共有的，也可以使是私有的，但是提供公有的访问方法
    enum Test {
        ONE(1), TWO(0), THREE(3);

        private final int value;

        private Test(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }
}
